import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

def draw_cuboid(long, wide, pretty, x, y, z, color):
    """
    生成并绘制三维立方体
    参数:
        long: 立方体长度
        wide: 立方体宽度
        pretty: 立方体高度
        x, y, z: 立方体底面中心点坐标
        color: 立方体颜色
    返回:
        V: 顶点坐标矩阵
        F: 面索引矩阵
    """
    # 计算立方体8个顶点坐标
    V = np.array([
        [x, y, z],                  # 底面顶点
        [x + long, y, z],
        [x, y + wide, z],
        [x + long, y + wide, z],
        [x, y, z + pretty],         # 顶面顶点
        [x + long, y, z + pretty],
        [x, y + wide, z + pretty],
        [x + long, y + wide, z + pretty]
    ])
    
    # 定义6个面的顶点索引 (注意MATLAB是1基索引，Python需要转为0基)
    F = np.array([
        [0, 1, 3, 2],  # 底面
        [4, 5, 7, 6],  # 顶面
        [0, 1, 5, 4],  # 前面
        [2, 3, 7, 6],  # 后面
        [0, 4, 6, 2],  # 左面
        [1, 5, 7, 3]   # 右面
    ])
    
    # 创建3D多边形集合
    fig = plt.gcf()
    ax = fig.gca(projection='3d') if '3d' not in str(ax) else ax
    
    # 添加立方体面
    cuboid = Poly3DCollection(V[F], facecolors=color, linewidths=1, edgecolors='k')
    ax.add_collection3d(cuboid)
    
    # 设置坐标轴范围
    max_range = np.array([V[:, 0].max()-V[:, 0].min(),
                          V[:, 1].max()-V[:, 1].min(),
                          V[:, 2].max()-V[:, 2].min()]).max() / 2.0
    mid_x = (V[:, 0].max() + V[:, 0].min()) * 0.5
    mid_y = (V[:, 1].max() + V[:, 1].min()) * 0.5
    mid_z = (V[:, 2].max() + V[:, 2].min()) * 0.5
    ax.set_xlim(mid_x - max_range, mid_x + max_range)
    ax.set_ylim(mid_y - max_range, mid_y + max_range)
    ax.set_zlim(mid_z - max_range, mid_z + max_range)
    
    return V, F